package com.itheima.service.mongo.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.itheima.domain.mongo.Friend;
import com.itheima.domain.mongo.UserLike;
import com.itheima.domain.mongo.Visitor;
import com.itheima.service.mongo.UserLikeService;
import com.itheima.vo.PageBeanVo;
import com.itheima.vo.UserLikeCountVo;
import com.itheima.vo.UserLikeVo;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.ArrayList;
import java.util.List;

@DubboService
public class UserLikeServiceImpl implements UserLikeService {

    @Autowired
    private MongoTemplate mongoTemplate;

    // 添加喜欢记录
    @Override
    public void save(UserLike userLike) {
        // 1.判断此用户是否已经喜欢过对方
        boolean exists = mongoTemplate.exists(new Query(Criteria.where("userId").is(userLike.getUserId()).and("likeUserId").is(userLike.getLikeUserId())), UserLike.class);
        // 2.不存在添加数据
        if (!exists) {
            mongoTemplate.save(userLike);
        }
    }

    // 判断双方是否为相互喜欢
    @Override
    public Boolean isMutualLike(Long userId, Long likeUserId) {
        // 1.你是否喜欢他
        boolean exists1 = mongoTemplate.exists(new Query(Criteria.where("userId").is(userId).and("likeUserId").is(likeUserId)), UserLike.class);
        // 2.他是否喜欢你
        boolean exists2 = mongoTemplate.exists(new Query(Criteria.where("userId").is(likeUserId).and("likeUserId").is(userId)), UserLike.class);
        return exists1 && exists2;
    }

    // 删除喜欢记录
    @Override
    public void remove(Long userId, Long likeUserId) {
        // 1.构建删除条件
        Query query = new Query(Criteria.where("userId").is(userId).and("likeUserId").is(likeUserId));
        // 2.执行删除
        mongoTemplate.remove(query, UserLike.class);
    }

    // 我的统计
    @Override
    public UserLikeCountVo findUserLikeCountVo(Long userId) {
        // 1.相互喜欢: 查询好友列表 (  从`friend`表中根据`userId`查询我的所有好友数量  )
        long eachLoveCount = mongoTemplate.count(new Query(Criteria.where("userId").is(userId)), Friend.class);

        // 2.喜欢: 查询你喜欢的用户 (  从`user_like`表中根据`userId`查询所有我喜欢的用户数量  )
        long loveCount = mongoTemplate.count(new Query(Criteria.where("userId").is(userId)), UserLike.class);

        // 3.粉丝: 查询别人喜欢你的用户 (  从`user_like`表中根据`likeUserId`查询所有喜欢我的用户数量 )
        long fanCount = mongoTemplate.count(new Query(Criteria.where("likeUserId").is(userId)), UserLike.class);

        // 4.封装并返回vo
        return new UserLikeCountVo(eachLoveCount, loveCount, fanCount);
    }

    // 我的详情
    @Override
    public PageBeanVo findUserLikeVoByType(Long userId, Integer type, Integer pageNum, Integer pageSize) {
        Integer index = (pageNum - 1) * pageSize;
        switch (type) {
            case 1: { // 相互喜欢: 查询好友列表 ( 从`friend`表中根据`userId`分页查询我的好友 )
                // 1.构建条件
                Query query = new Query(Criteria.where("userId").is(userId)).skip(index).limit(pageSize);
                // 2.查询list
                List<Friend> friendList = mongoTemplate.find(query, Friend.class);
                // 2-1 封装vo
                List<UserLikeVo> voList = new ArrayList<>();
                if (CollectionUtil.isNotEmpty(friendList)) {
                    for (Friend friend : friendList) {
                        // 创建vo
                        UserLikeVo vo = new UserLikeVo();
                        vo.setId(friend.getFriendId());
                        // 添加集合中
                        voList.add(vo);
                    }
                }
                // 3.查询count
                long count = mongoTemplate.count(query, Friend.class);
                // 4.封装并返回分页对象
                return new PageBeanVo(pageNum, pageSize, count, voList);
            }
            case 2: { // 喜欢: 查询你喜欢的用户 ( 从`user_like`表中根据`userId`分页查询我喜欢的用户 )
                // 1.构建条件
                Query query = new Query(Criteria.where("userId").is(userId)).skip(index).limit(pageSize);
                // 2.查询list
                List<UserLike> userLikeList = mongoTemplate.find(query, UserLike.class);
                // 2-1 声明voList
                List<UserLikeVo> voList = new ArrayList<>();
                // 2-2 遍历
                if (CollectionUtil.isNotEmpty(userLikeList)) {
                    for (UserLike userLike : userLikeList) {
                        // 创建vo
                        UserLikeVo vo = new UserLikeVo();
                        vo.setId(userLike.getLikeUserId());

                        // 将vo添加到集合
                        voList.add(vo);
                    }
                }
                // 3.查询count
                long count = mongoTemplate.count(query, UserLike.class);
                // 4.封装并返回分页对象
                return new PageBeanVo(pageNum, pageSize, count, voList);
            }
            case 3: { // 粉丝: 查询别人喜欢你的用户 ( 从`user_like`表中根据`likeUserId`分页查询喜欢我的用户 )
                // 1.构建条件
                Query query = new Query(Criteria.where("likeUserId").is(userId)).skip(index).limit(pageSize);
                // 2.查询list
                List<UserLike> userLikeList = mongoTemplate.find(query, UserLike.class);
                // 2-1声明voList
                List<UserLikeVo> voList = new ArrayList<>();
                // 2-2 遍历
                if (CollectionUtil.isNotEmpty(userLikeList)) {
                    for (UserLike userLike : userLikeList) {
                        // 创建vo
                        UserLikeVo vo = new UserLikeVo();
                        vo.setId(userLike.getUserId());

                        // 将vo添加到list
                        voList.add(vo);
                    }
                }
                // 3.查询count
                long count = mongoTemplate.count(query, UserLike.class);
                // 4.封装并返回分页对象
                return new PageBeanVo(pageNum, pageSize, count, voList);
            }
            case 4: { // 谁看过我: 查询访客列表( 从`visitor`表中根据`userId`分页查询访问过的用户 )
                // 1.构建条件
                Query query = new Query(Criteria.where("userId").is(userId)).skip(index).limit(pageSize);
                // 2.查询list
                List<Visitor> visitorList = mongoTemplate.find(query, Visitor.class);
                // 2-1 声明voList
                List<UserLikeVo> voList = new ArrayList<>();
                // 2-2 遍历
                if (CollectionUtil.isNotEmpty(visitorList)) {
                    for (Visitor visitor : visitorList) {
                        // 创建vo
                        UserLikeVo vo = new UserLikeVo();
                        vo.setId(visitor.getVisitorUserId());
                        vo.setMatchRate(visitor.getScore().intValue()); // 历史访客需要指定缘分值。。。
                        // 添加vo到集合中
                        voList.add(vo);
                    }
                }
                // 3.查询count
                long count = mongoTemplate.count(query, Visitor.class);
                // 4.封装并返回分页对象
                return new PageBeanVo(pageNum, pageSize, count, voList);
            }
        }
        return new PageBeanVo();
    }
}
